package model;

import java.util.ArrayList;
import java.util.Collection;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;

import org.apache.log4j.Logger;

@Entity
public class Fornecedor {
	private static Logger logger = Logger.getLogger(Fornecedor.class);

	/* Atributos normais */
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long fornecedor_id;

	private String nome;

	private String telefone;

	private String nomedocontato;

	/* Atributos de relacionamento */
	@ManyToMany(cascade = CascadeType.PERSIST)
	@JoinTable(name = "FORNECE", joinColumns = @JoinColumn(name = "fornecedor_id"), inverseJoinColumns = @JoinColumn(name = "produto_id"))
	private Collection<Produto> produtos = new ArrayList<Produto>();

	/* Construtor sem argumentos para o JPA */
	public Fornecedor() {
		/* Uma gambiarra oficial para descobrir quem chamou o construtor */
		try {
			throw new IllegalStateException();
		} catch (IllegalStateException e) {
			StackTraceElement[] stackTrace = e.getStackTrace();
			StackTraceElement stackTraceElement = stackTrace[1];
			if(stackTraceElement.getClassName().equals("sun.reflect.NativeConstructorAccessorImpl")){
				Fornecedor.logger.debug("JPA construindo um fornecedor");
			}else{
				Fornecedor.logger.info("Construindo um fornecedor");
			}
		}
	}

	/* RELACIONAMENTO COM PRODUTO */
	public Collection<Produto> getProdutos() {
		return produtos;
	}

	public void addProduto(Produto produto) {
		this.produtos.add(produto);
	}

	/* GETTERS E SETTERS */
	public Long getFornecedor_id() {
		return fornecedor_id;
	}

	public void setFornecedor_id(Long fornecedor_id) {
		this.fornecedor_id = fornecedor_id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getNomedocontato() {
		return nomedocontato;
	}

	public void setNomedocontato(String nomedocontato) {
		this.nomedocontato = nomedocontato;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	/* Métodos reescritos */
	@Override
	public int hashCode() {
		final int PRIME = 31;
		int result = 1;
		result = PRIME * result
				+ ((fornecedor_id == null) ? 0 : fornecedor_id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final Fornecedor other = (Fornecedor) obj;
		if (fornecedor_id == null) {
			if (other.fornecedor_id != null)
				return false;
		} else if (!fornecedor_id.equals(other.fornecedor_id))
			return false;
		return true;
	}

	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("\n--------------------" + this.getClass().getName() + "--------------------\n");
		builder.append("Nome: " + this.nome + "\n");
		builder.append("Descriçãoo: " + this.nomedocontato + "\n");
		builder.append("Peso: " + this.telefone);
		builder.append("\n--------------------" + this.getClass().getName() + "--------------------\n");
		return builder.toString();
	}
}
